查看原文
其他

一文搞定相关性分析

BIOMAMBA Biomamba 生信基地 2023-06-15

一、先谈谈概念性的东西:

1、何为相关性:

在医药研究中常常涉及到一些变量间的关系分析,如儿童年龄与体重关系、血药浓度与时间的关系等。而变量之间的关系通常可以分为确定性关系与非确定性的关系两大类[1]


确定性关系是指,当一个变量取值后,另一变量有一个确定的值与之对应,比如圆的半径与周长之间就有“2πr”的确定关系。但是我们实际科研中遇到的变量之间,属于不确定关系的往往是大多数,如人的身高与体重、年龄与血压等。即一个变量取值后,另一个变量只会落一个包含某种规律的取值范围内,而并不能对应一个准确的值,这种不能用精确函数来表达的变量关系,我们通常称之为不确定关系。当然,非确定性关系也并非完全不能用函数的方式去模拟(例如回归分析)。


2、何为相关性分析:

在数据处理的过程中,我们一般将描述和分析变量相关关系的性质及其相关程度的过程,称为相关分析。最简单的相关性分析方法就是绘制一个散点图直观的观察两个变量之间的相关性。在统计与分析之中,我们不仅要了解变量之间是否相关,通常还需要相关的程度、方向,因此需要数字化一些的方法——统计推断。
我们通常用样本相关系数(r)反映两个变量之间线性关系的强弱,|r|的值越接近与1,则变量之间的相关性程度就越高;越接近于0,则变量之间的相关性程度就越低。
当|r|=0时,两变量之间呈完全线性相关,此时散点图的所有对应点应该在同一条直线上。当0<|r|<1时则表示两变量之间存在一定的相关性关系。当r=0时,则两变量之间完全不存在线性相关关系(但不排除有其他曲线关系)。
比如下面这个就是r=1时的极端例子:

##### 构建一个数据集 #####
suppressMessages(library(ggplot2))
mydata <- as.data.frame(cbind(1:10, 2:11))
head(mydata)
## V1 V2
## 1 1 2
## 2 2 3
## 3 3 4
## 4 4 5
## 5 5 6
## 6 6 7


#### 做个线性回归的计算
lm.model <- lm(V1 ~ V2,data = mydata)
summary(lm.model)
## Warning in summary.lm(lm.model): essentially perfect fit: summary may be
## unreliable
##
## Call:
## lm(formula = V1 ~ V2, data = mydata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.661e-16 -1.157e-16 4.273e-17 2.153e-16 4.167e-16
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.000e+00 2.815e-16 -3.553e+15 <2e-16 ***
## V2 1.000e+00 3.961e-17 2.525e+16 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.598e-16 on 8 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: 1
## F-statistic: 6.374e+32 on 1 and 8 DF, p-value: < 2.2e-16

### 把斜率a和截距b取出来
a <- lm.model$fitted.values[1]
b <- lm.model$fitted.values[2]
a
## 1
## 1
b
## 2
## 2

ggplot(data = mydata,aes(V1,V2))+geom_point()+geom_line()+
ggtitle(label = paste("y = ", a, " * x + ", b, sep = ""))

#可以看到,线性相关性是比较强的


3、相关系数最常见的两种算法

(1)、Pearson相关系数


(2)、Spearman相关系数


知道大家对公式及计算方法不感兴趣,我也是如此,但是你需要知道的是,Spearman系数不要求两变量分布符合正态分布,这就导致Spearman系数适用范围更广的同时计算精确度也相应的更低。


二、R语言实现及可视化——ggcorrplot

针对上述的各种相关性分析,SPSS与Graphpad中也有较为完善的操作流程供大家使用。这里我们给大家推荐一个R语言中进行相关性可视化的神器——ggcorplot2[2]

tips:下面的corr就是我们刚才提到的r值

########## ggcorrplot 用法 ############3
#参考:https://github.com/kassambara/ggcorrplot
if(!require("ggcorrplot"))install.packages("ggcorrplot")

data(mtcars)#加载数据
class(mtcars)
## [1] "data.frame"
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
corr <- round(cor(mtcars), 1)#计算每列变量间的相关性
head(corr[, 1:6])
## mpg cyl disp hp drat wt
## mpg 1.0 -0.9 -0.8 -0.8 0.7 -0.9
## cyl -0.9 1.0 0.9 0.8 -0.7 0.8
## disp -0.8 0.9 1.0 0.8 -0.7 0.9
## hp -0.8 0.8 0.8 1.0 -0.4 0.7
## drat 0.7 -0.7 -0.7 -0.4 1.0 -0.7
## wt -0.9 0.8 0.9 0.7 -0.7 1.0
p.mat <- cor_pmat(mtcars)
head(p.mat[, 1:4])
## mpg cyl disp hp
## mpg 0.000000e+00 6.112687e-10 9.380327e-10 1.787835e-07
## cyl 6.112687e-10 0.000000e+00 1.802838e-12 3.477861e-09
## disp 9.380327e-10 1.802838e-12 0.000000e+00 7.142679e-08
## hp 1.787835e-07 3.477861e-09 7.142679e-08 0.000000e+00
## drat 1.776240e-05 8.244636e-06 5.282022e-06 9.988772e-03
## wt 1.293959e-10 1.217567e-07 1.222320e-11 4.145827e-05
ggcorrplot(corr)#最简单的相关性热图



ggcorrplot(corr, method = "circle")#让热图的方框变成圆圈



ggcorrplot(corr, hc.order = TRUE, outline.color = "white")#设置边界颜色



ggcorrplot(corr,
hc.order = TRUE,#设置是否聚类
type = "lower",#设置三角形对着的方式
outline.color = "white")



ggcorrplot(
corr,
hc.order = TRUE,
type = "lower",
outline.color = "white",
ggtheme = ggplot2::theme_gray,
colors = c("#6D9EC1", "white", "#E46726")
)#设置主题和颜色



ggcorrplot(corr,
hc.order = TRUE,
type = "lower",
lab = TRUE)#是否展示C值



ggcorrplot(corr,
hc.order = TRUE,
type = "lower",
p.mat = p.mat)#是否展示p值



ggcorrplot(
corr,
p.mat = p.mat,
hc.order = TRUE,
type = "lower",
insig = "blank"
)#是否将不显著的色块移除






最后,考虑到站内的粉丝有一部分是冲着在线工具来的,在线版的ggcorrplot工具我也已发布并测试成功,下一条推送我将发布工具使用教程。以下附上测试视频:


参考:

[1]: 高祖新 言方荣 医药统计分析与SPSS软件应用[M].北京:人民卫生出版社,2018:169-187.

[2]: https://github.com/kassambara/ggcorrplot

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存